﻿@page "/imageBackground"
@implements IDisposable
@rendermode InteractiveWebAssembly
@inject HttpClient client

@foreach (var url in backgroundUrls) //预加载图片，防止第一次打开网页时背景出现闪烁
{
    <link rel="preload" href="/images/@url" as="image" fetchpriority="high">
}
<div class="image-scroller" style="background-image: url('/images/@backgroundUrl');"></div>

@code {

    [Parameter]
    public string razorName { get; set; } = "star rail"; // 需要设置背景的组件名称
    public string? backgroundUrl = "star rail/background/defualt.webp"; // 默认图片路径
    private System.Timers.Timer? Timer; // 定时器实例（可空类型）
    private List<string> backgroundUrls = new List<string>(); // 背景图片列表
    private int currentIndex = 0; // 当前背景图片索引

    public void Dispose()
    {
        StopTimer(); // 确保组件销毁时停止定时器
    }

    private void StopTimer()
    {
        if (Timer != null && Timer.Enabled)
        {
            Timer.Stop(); // 停止定时器
            Timer.Dispose(); // 释放资源（重要！）
            Timer = null; // 置空引用
        }
    }

    private void StartTimer()
    {
        if (Timer != null)
        {
            Timer.Start(); // 启动定时器
        }
    }

    // 初始化时创建定时器
    protected override async Task OnInitializedAsync()
    {
        await base.OnInitializedAsync(); // 调用基类方法
        try
        {
            if (client.BaseAddress != null)
            {
                HttpResponseMessage response = await client.GetAsync($"{client.BaseAddress}api/filename/{razorName}/background");
                response.EnsureSuccessStatusCode();
                backgroundUrls = await response.Content.ReadFromJsonAsync<List<string>>() ?? new List<string>();
                if (backgroundUrls.Count > 0)
                {
                    await InvokeAsync(() =>
                    {
                        backgroundUrl = backgroundUrls[0]; // 设置初始背景图片
                        StateHasChanged(); // 手动刷新界面（确保 UI 更新）
                    });
                }
            }
            Timer = new System.Timers.Timer(1000 * 30); // 间隔（30秒）
            Timer.Elapsed += OnTimerElapsed; // 绑定定时事件
            Timer.AutoReset = true; // 自动重复触发
            Timer.Enabled = true; // 启用定时器
        }
        catch (Exception ex)
        {
            
        }
    }

    // 定时器触发时的回调（更新时间并刷新界面）
    private async void OnTimerElapsed(object? sender, ElapsedEventArgs e)
    {
        try
        {
            currentIndex = (currentIndex + 1) % backgroundUrls.Count; // 循环更新索引
            backgroundUrl = backgroundUrls[currentIndex]; // 更新背景图片路径
            // 更新状态（必须在 UI 线程执行）
            await InvokeAsync(() =>
            {
                StateHasChanged(); // 手动刷新界面（确保 UI 更新）
            });
            Timer?.Start(); // 停止定时器以避免重复触发
        }
        catch (Exception ex)
        {
            
        }
    }
}
